// #include <iostream>
// #include<string>
//
// using namespace  std;
// //重载问题
// int sum(int a,int b)
// {
//     cout << "普通函数" << endl;
//     return a+b;
// }
//
// template<typename T>
// T sum (T a,T b)
// {
//     cout << "模版函数" << endl;
//     return a+b;
// }
//
// //函数模版与模版重载
// //优先调用需要推导类型数少的模版
// template<typename T1>
// void print(T1 a)
// {
//     cout << a << endl;
// }
//
// template<typename T1,typename T2>
// void print(T1 a)
// {
//     cout << a << endl;
// }
//
// //既然模版是类型的传参 所以模版也是可以缺省的
// template<typename T1=int,typename T2=string>
// void print_data(T1 a,T2 b)
// {
//     cout << "print_data" << endl;
// }
// //模版传入变量 一旦有变量 不能隐式调用了
// template<typename  T1,int size=1>
// T1* create_date()
// {
//     T1* p = new T1[size];
//     return p;
// }
// //含有函数指针的模版
// //用函数指针类型充当模版 //_Pr
// template<typename DataType,int size,typename _Pr=bool(*)(DataType,DataType)>
// void bubble_sort(DataType* arr,_Pr func)
// {
//     for (int i=0;i<size;i++)
//     {
//         for (int j=0;j<size-i-1;j++)
//         {
//             if (func(arr[j],arr[j+1]))
//             {
//                 DataType temp = arr[j];
//                 arr[j] = arr[j+1];
//                 arr[j+1] =temp;
//             }
//         }
//     }
// }
//
// bool compare(int a,int b)
// {
//     return a >b;
// }
// //类当中的成员函数是模版
//
//
// int main()
// {
//     //如果函数模版和普通函数都可以满足调用 优先调用普通函数
//     cout  << sum(1,2) << endl;
//     cout << sum(1.2,1.1) << endl;
//     //显示写百分百调用模版函数
//     cout << sum<int>(1,3) << endl;
//     print_data<int>(3,"abc");
//
//     //这里值必须是常量 必须是右值
//     auto date = create_date<int ,1>();
//     for (int i=0;i<1;i++)
//     {
//         cout << date[i] << endl;
//     }
//     delete(date);
//
//     int arr[3] = {1,3,2};
//     //* + 指针名 替换函数名 其他照抄
//     // bool(*a)(int,int) =&compare;
//     using FuncType = bool(*)(int,int);
//     // bubble_sort<int,3,bool(*)(int a,int b)>(arr,compare);
//     bubble_sort<int,3,FuncType>(arr,compare);
//
//     //lambda 表达式
//     bubble_sort<int,3>(arr,[](int a,int b){return a > b;});
//
//     return 0;
// }
//
